<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>

<body>
    <script>
        // 以后需要回去学的一个方法：Object.getPrototypeOf(obj)
        //【1】使用构造函数创建一个对象
        function Person() {

        }
        var person = new Person();
        person.name = 'sky';
        console.log(person.name); //
        //【2】prototype，构造函数的prototype指向原型，实例的__proto__也指向原型。
        function Person() {

        }
        // 虽然写在注释里，但是你要注意：
        // prototype是函数才会有的属性
        Person.prototype.name = 'Kevin';
        var person1 = new Person();
        var person2 = new Person();
        console.log(person1.name) // Kevin
        console.log(person2.name); // Kevin
        //【3】原型的constructor指向构造函数，
        // 因为实例很多，原型不会指向实例的。
        // 但是实例是指向原型的，实例通过__proto__找到原型，原型又通过__proto__找到原型的原型，所以，【这里有一个原型同时是实例的概念】
        // 原型链，可以粗暴的理解为__proto__链条【但是，__proto__不是真的存在于Person.prototype上的，它来自于Object.prototype与其说是一个属性，不如说是一个 getter/setter，当使用 obj.__proto__ 时，可以理解成返回了 Object.getPrototypeOf(obj)。】
        function Person() {

        }

        var person = new Person();

        console.log(person.__proto__ == Person.prototype) // true
        console.log(Person.prototype.constructor == Person); // true
        // 顺便学习一个ES5的方法,可以获得对象的原型
        console.log(Object.getPrototypeOf(person) === Person.prototype); // true
        //【4】当我们在构造函数上添加方法的时候，访问会直接在实例上找方法，找不到才会去原型上找。
        function Person() {

        }

        Person.prototype.name = 'Kevin';

        var person = new Person();

        person.name = 'Daisy';
        console.log(person.name) // Daisy

        delete person.name;
        console.log(person.name); // Kevin
        //【5】包装函数Object()
        //这里有个关键知识点。Person.prototype既然是一个对象，它必然是可以通过new Object这种方式创建的
        // 所以，我们要注意，很多时候原型指向Object.prototype.
        var obj = new Object();
        obj.name = 'Kevin'
        console.log(obj.name); // Kevin
        //【6】Object.prototype这个对象的原型指向哪里
        //null
        console.log(Object.prototype.__proto__ === null) // true
    </script>
</body>

</html>